import * as types from "../action-types";
import {all, put, take, call, fork, cancel, cancelled} from 'redux-saga/effects';
import Api from './Api';

function* login(username, password) {
    try {
        Api.setItem('loading', 'true');
        const token = yield call(Api.login, username, password)
        yield put({type: types.LOGIN_SUCCESS, payload: token})
        Api.setItem('loading', 'false');

    } catch (e) {
        alert(e);
        yield put({type: types.LOGIN_ERROR, e})
        Api.setItem('loading', 'false');

    }/*finally {
        if (yield cancelled) {
            const token = yield call(Api.login, username, password)
            yield put({type: types.LOGIN_SUCCESS, payload: token})
            Api.setItem('loading','false');
        }
    }*/
}

//saga如何处理登录，退出     ：监听登录，注册的动作，来调接口
export default function* loginSaga() {
    while (true) {
        let {payload: {username, password}} = yield take(types.LOGIN);
        // yield call(login, username, password)
        //问题：必须登录成功才可以执行退出，利用fork，单独开启了一个子进程，他会单独去执行而不影响当前的主进程，主进程会继续往下执行
        //无法拿到login的返回值，但是可以得到一个任务子对象
        let task =yield fork(login, username, password);
        //监听退出的动作action
        let action = yield take([types.LOGOUT,types.LOGOUT_SUCCESS,types.LOGIN_ERROR]);

        //这句代码就相当于直接截断了login中第一句，不会走success
        if (action.type === types.LOGOUT) {
            yield  cancel(task)
        }
        //派发退出成功的动作，把token删除掉
        yield  put({type: types.LOGOUT_SUCCESS})

    }

}
